home *** CD-ROM | disk | FTP | other *** search
- PROGRAM mazes;
- {
- This IBM PC program will produce a series of mazes on
- an EPSON MX-80 printer. A different random number seed will
- produce a different series of mazes.
-
- Written by James L. Dean
- 406 40th Street
- New Orleans, LA 70124
- }
- CONST
- num_columns = 95;
- x_max = 190; {2*num_columns}
- num_rows = 120;
- y_max = 240; {2*num_rows}
- TYPE
- stack_rec_ptr = ^stack_rec;
- stack_rec = RECORD
- index_1 : BYTE;
- index_2 : BYTE;
- next_ptr : stack_rec_ptr
- END;
- VAR
- column : INTEGER;
- column_mod_5 : INTEGER;
- counter_0 : INTEGER;
- counter_1 : INTEGER;
- counter_2 : INTEGER;
- counter_3 : INTEGER;
- counter_4 : INTEGER;
- counter_5 : INTEGER;
- counter_6 : INTEGER;
- counter_7 : INTEGER;
- delta_index_1 : INTEGER;
- delta_index_1a : INTEGER;
- delta_index_1b : INTEGER;
- delta_index_1c : INTEGER;
- delta_index_1d : INTEGER;
- delta_index_2 : INTEGER;
- delta_x : ARRAY [1..4,1..24] OF INTEGER;
- delta_y : ARRAY [1..4,1..24] OF INTEGER;
- maze_num : INTEGER;
- num_mazes : INTEGER;
- page : ARRAY [0..y_max,0..x_max] OF CHAR;
- passage_found : BOOLEAN;
- power_of_two : INTEGER;
- print_line : ARRAY[0..479] OF BYTE;
- r_n : ARRAY [1..8] OF INTEGER;
- r_n_index_1 : INTEGER;
- r_n_index_2 : INTEGER;
- response : CHAR;
- row_mod_6 : INTEGER;
- seed : STRING[8];
- stack_head : stack_rec_ptr;
- stack_ptr : stack_rec_ptr;
- tem_int : INTEGER;
- tem_real : REAL;
- x : INTEGER;
- x_next : INTEGER;
- x_out : INTEGER;
- x_wall_1 : INTEGER;
- y : INTEGER;
- y_next : INTEGER;
- y_out : INTEGER;
- y_wall_1 : INTEGER;
- FUNCTION uniform(VAR counter_0,counter_1,counter_2,counter_3,
- counter_4,counter_5,counter_6,counter_7 : INTEGER) : REAL;
- CONST
- substitution_high : ARRAY (.0..99.) OF INTEGER =(
- 4,1,2,8,8,9,9,6,5,7,2,1,2,9,8,8,6,3,5,1,9,5,4,4,9,8,6,0,8,0,
- 6,0,2,4,1,9,2,0,7,4,7,3,0,0,2,6,8,9,4,0,8,3,2,3,2,5,2,4,6,9,
- 7,9,1,3,5,7,1,1,4,5,8,1,6,0,5,7,8,2,3,3,7,3,5,1,7,5,4,0,3,6,
- 3,7,7,1,9,4,0,5,6,6);
- substitution_low : ARRAY (.0..99.) OF INTEGER =(
- 1,2,2,1,5,5,4,6,4,6,4,4,5,6,6,3,0,9,6,5,7,2,0,9,3,4,2,3,9,1,
- 9,9,9,3,8,9,3,4,1,5,0,5,2,7,0,8,8,0,4,5,0,3,6,8,1,7,8,8,7,1,
- 3,2,7,7,1,8,0,3,7,5,2,6,4,0,9,9,7,7,4,6,2,0,0,1,7,3,6,6,1,1,
- 2,4,5,9,8,2,8,8,3,5);
- VAR
- iteration,
- seed_0,
- seed_1,
- seed_2,
- seed_3,
- seed_4,
- seed_5,
- seed_6,
- seed_7,
- substitution_index,
- tem_0,
- tem_1,
- tem_2,
- tem_3
- : INTEGER;
- dividend,
- tem_real
- : REAL;
- BEGIN
- tem_2:=counter_0+1;
- IF tem_2 <= 9 THEN
- counter_0:=tem_2
- ELSE
- BEGIN
- counter_0:=0;
- tem_2:=counter_1+1;
- IF tem_2 <= 9 THEN
- counter_1:=tem_2
- ELSE
- BEGIN
- counter_1:=0;
- tem_2:=counter_2+1;
- IF tem_2 <= 9 THEN
- counter_2:=tem_2
- ELSE
- BEGIN
- counter_2:=0;
- tem_2:=counter_3+1;
- IF tem_2 <= 9 THEN
- counter_3:=tem_2
- ELSE
- BEGIN
- counter_3:=0;
- tem_2:=counter_4+1;
- IF tem_2 <= 9 THEN
- counter_4:=tem_2
- ELSE
- BEGIN
- counter_4:=0;
- tem_2:=counter_5+1;
- IF tem_2 <= 9 THEN
- counter_5:=tem_2
- ELSE
- BEGIN
- counter_5:=0;
- tem_2:=counter_6+1;
- IF tem_2 <= 9 THEN
- counter_6:=tem_2
- ELSE
- BEGIN
- counter_6:=0;
- tem_2:=counter_7+1;
- IF tem_2 <= 9 THEN
- counter_7:=tem_2
- ELSE
- counter_7:=0
- END
- END
- END
- END
- END
- END
- END;
- seed_0:=counter_0;
- seed_1:=counter_1;
- seed_2:=counter_2;
- seed_3:=counter_3;
- seed_4:=counter_4;
- seed_5:=counter_5;
- seed_6:=counter_6;
- seed_7:=counter_7;
- FOR iteration:=1 TO 8 DO
- BEGIN
- substitution_index:=10*seed_1+seed_0;
- tem_0:=substitution_low(.substitution_index.);
- tem_1:=substitution_high(.substitution_index.);
- substitution_index:=10*seed_3+seed_2;
- seed_0:=substitution_low(.substitution_index.);
- tem_3:=substitution_high(.substitution_index.);
- substitution_index:=10*seed_5+seed_4;
- seed_2:=substitution_low(.substitution_index.);
- seed_1:=substitution_high(.substitution_index.);
- substitution_index:=10*seed_7+seed_6;
- seed_5:=substitution_low(.substitution_index.);
- seed_7:=substitution_high(.substitution_index.);
- seed_3:=tem_0;
- seed_6:=tem_1;
- seed_4:=tem_3
- END;
- tem_2:=1000*seed_3+100*seed_2+10*seed_1+seed_0;
- tem_real:=tem_2;
- tem_real:=tem_real/10000.0;
- tem_2:=1000*seed_7+100*seed_6+10*seed_5+seed_4;
- dividend:=tem_2;
- tem_real:=(dividend+tem_real)/10000.0;
- uniform:=tem_real
- END;
- BEGIN
- ClrScr;
- WRITELN(OUTPUT,' Maze Generator');
- WRITELN(OUTPUT,' '); WRITELN(OUTPUT,' '); WRITELN(OUTPUT,' ');
- WRITE(OUTPUT,'How many mazes are to be generated? ');
- READLN(INPUT,num_mazes);
- IF num_mazes >= 1 THEN
- BEGIN
- WRITELN(OUTPUT,' ');
- WRITE(OUTPUT,'Random number seed? ');
- READLN(INPUT,seed);
- WHILE (Length(seed) < 8) DO seed:=CONCAT('0',seed);
- counter_0:=ORD(seed[1]) MOD 10;
- counter_1:=ORD(seed[2]) MOD 10;
- counter_2:=ORD(seed[3]) MOD 10;
- counter_3:=ORD(seed[4]) MOD 10;
- counter_4:=ORD(seed[5]) MOD 10;
- counter_5:=ORD(seed[6]) MOD 10;
- counter_6:=ORD(seed[7]) MOD 10;
- counter_7:=ORD(seed[8]) MOD 10;
- WRITELN(OUTPUT,' ');
- WRITELN(OUTPUT,'Position your paper at top of form and press RETURN.');
- READLN(INPUT,response);
- IF num_mazes = 1 THEN
- WRITELN(OUTPUT,'Generating maze...')
- ELSE
- WRITELN(OUTPUT,'Generating mazes...');
- delta_x[1,1]:=-1;
- delta_y[1,1]:=0;
- delta_x[2,1]:=0;
- delta_y[2,1]:=1;
- delta_x[3,1]:=1;
- delta_y[3,1]:=0;
- delta_x[4,1]:=0;
- delta_y[4,1]:=-1;
- delta_index_2:=0;
- FOR delta_index_1a:=1 TO 4 DO
- FOR delta_index_1b:=1 TO 4 DO
- IF delta_index_1a <> delta_index_1b THEN
- FOR delta_index_1c:=1 TO 4 DO
- IF ((delta_index_1a <> delta_index_1c)
- AND (delta_index_1b <> delta_index_1c)) THEN
- FOR delta_index_1d:=1 TO 4 DO
- IF ((delta_index_1a <> delta_index_1d)
- AND (delta_index_1b <> delta_index_1d)
- AND (delta_index_1c <> delta_index_1d)) THEN
- BEGIN
- delta_index_2:=delta_index_2+1;
- delta_x[delta_index_1a,delta_index_2]:=delta_x[1,1];
- delta_y[delta_index_1a,delta_index_2]:=delta_y[1,1];
- delta_x[delta_index_1b,delta_index_2]:=delta_x[2,1];
- delta_y[delta_index_1b,delta_index_2]:=delta_y[2,1];
- delta_x[delta_index_1c,delta_index_2]:=delta_x[3,1];
- delta_y[delta_index_1c,delta_index_2]:=delta_y[3,1];
- delta_x[delta_index_1d,delta_index_2]:=delta_x[4,1];
- delta_y[delta_index_1d,delta_index_2]:=delta_y[4,1]
- END;
- FOR maze_num:=1 TO num_mazes DO
- BEGIN
- seed:='';
- FOR r_n_index_1:=1 TO 8 DO
- BEGIN
- tem_real:=10.0*uniform(counter_0,counter_1,counter_2,counter_3,
- counter_4,counter_5,counter_6,counter_7);
- tem_int:=TRUNC(tem_real);
- tem_int:=tem_int+ORD('0');
- seed:=CONCAT(seed,CHR(tem_int));
- WHILE (tem_int > 29) DO tem_int:=tem_int-29;
- IF tem_int = 0 THEN tem_int:=1;
- r_n[r_n_index_1]:=tem_int
- END;
- FOR x_out:=0 TO x_max DO
- FOR y_out:=0 TO y_max DO
- page[y_out,x_out]:='W';
- IF ODD(num_columns) THEN
- x:=num_columns
- ELSE
- x:=(num_columns-1);
- IF ODD(num_rows) THEN
- y:=num_rows
- ELSE
- y:=(num_rows-1);
- page[y,x]:=' ';
- stack_head:=NIL;
- REPEAT
- delta_index_1:=1;
- REPEAT
- delta_index_2:=r_n[1];
- r_n_index_1:=1;
- FOR r_n_index_2:=2 TO 8 DO
- BEGIN
- tem_int:=r_n[r_n_index_2];
- r_n[r_n_index_1]:=tem_int;
- delta_index_2:=delta_index_2+tem_int;
- IF delta_index_2 > 29 THEN
- delta_index_2:=delta_index_2-29;
- r_n_index_1:=r_n_index_2
- END;
- r_n[8]:=delta_index_2
- UNTIL
- (delta_index_2 <= 24);
- passage_found:=FALSE;
- REPEAT
- WHILE ((delta_index_1 <= 4) AND (NOT passage_found)) DO
- BEGIN
- x_next:=x+2*delta_x[delta_index_1,delta_index_2];
- IF x_next <= 0 THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF x_next >= x_max THEN
- delta_index_1:=delta_index_1+1
- ELSE
- BEGIN
- y_next:=y+2*delta_y[delta_index_1,delta_index_2];
- IF y_next <= 0 THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF y_next >= y_max THEN
- delta_index_1:=delta_index_1+1
- ELSE
- IF page[y_next,x_next] = 'W' THEN
- passage_found:=TRUE
- ELSE
- delta_index_1:=delta_index_1+1
- END
- END;
- IF (NOT passage_found) THEN
- BEGIN
- delta_index_1:=stack_head^.index_1;
- delta_index_2:=stack_head^.index_2;
- x:=x-2*delta_x[delta_index_1,delta_index_2];
- y:=y-2*delta_y[delta_index_1,delta_index_2];
- stack_ptr:=stack_head;
- stack_head:=stack_head^.next_ptr;
- DISPOSE(stack_ptr);
- delta_index_1:=delta_index_1+1
- END
- UNTIL ((passage_found) OR (stack_head = NIL));
- IF passage_found THEN
- BEGIN
- NEW(stack_ptr);
- stack_ptr^.next_ptr:=stack_head;
- stack_head:=stack_ptr;
- stack_head^.index_1:=delta_index_1;
- stack_head^.index_2:=delta_index_2;
- page[y_next,x_next]:=' ';
- IF x = x_next THEN
- BEGIN
- y_wall_1:=(y+y_next) DIV 2;
- page[y_wall_1,x_next]:=' '
- END
- ELSE
- BEGIN
- x_wall_1:=(x+x_next) DIV 2;
- page[y_next,x_wall_1]:=' '
- END;
- x:=x_next;
- y:=y_next
- END
- UNTIL (stack_head = NIL);
- page[0,1]:=' ';
- page[y_max,x_max-1]:=' ';
- WRITE(LST,CHR(27),'A',CHR(8),chr(27),'2');
- power_of_two:=128;
- FOR column:=0 TO 479 DO
- print_line[column]:=0;
- row_mod_6:=0;
- y_out:=0;
- WHILE (y_out <= y_max) DO
- BEGIN
- column:=0;
- column_mod_5:=0;
- x_out:=0;
- WHILE (x_out <= x_max) DO
- BEGIN
- IF page[y_out,x_out] = 'W' THEN
- print_line[column]:=print_line[column]+power_of_two;
- IF column_mod_5 = 0 THEN
- x_out:=x_out+1;
- column:=column+1;
- column_mod_5:=column_mod_5+1;
- IF column_mod_5 >= 5 THEN
- BEGIN
- column_mod_5:=0;
- x_out:=x_out+1
- END
- END;
- power_of_two:=power_of_two DIV 2;
- IF power_of_two = 0 THEN
- BEGIN
- WRITE(LST,CHR(27)); WRITE(LST,'K');
- WRITE(LST,CHR(224)); WRITE(LST,CHR(1));
- power_of_two:=128;
- FOR column:=0 TO 479 DO
- BEGIN
- WRITE(LST,CHR(print_line[column]));
- print_line[column]:=0
- END
- END;
- IF row_mod_6 = 0 THEN
- y_out:=y_out+1;
- row_mod_6:=row_mod_6+1;
- IF row_mod_6 >= 6 THEN
- BEGIN
- row_mod_6:=0;
- y_out:=y_out+1
- END
- END;
- WRITE(LST,CHR(27)); WRITE(LST,'K');
- WRITE(LST,CHR(224)); WRITE(LST,CHR(1));
- FOR column:=0 TO 479 DO
- WRITE(LST,CHR(print_line[column]));
- WRITE(LST,CHR(27),'A',CHR(12),CHR(27),'2');
- WRITELN(LST,' ');
- WRITE(LST,'Seed: '); WRITELN(LST,SEED);
- WRITE(LST,CHR(12))
- END;
- WRITE(LST,CHR(12))
- END
- END.